/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufc.quixada.adrs.dao;

import br.ufc.quixada.adrs.dao.config.PostGresMapConfig;
import br.ufc.quixada.adrs.model.Contato;
import br.ufc.quixada.adrs.model.Produtor;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 *
 * @author franklin barroso
 */
public class ProdutorDAO {

    public synchronized void insert(Produtor produtor) throws SQLException {
        Long l = (Long) PostGresMapConfig.getSqlMapClient().queryForObject("getMaxIdUsuario");
        if (l == null) {
            l = 0L;
        }
        produtor.getUsuario().setId(l + 1);

        l = (Long) PostGresMapConfig.getSqlMapClient().queryForObject("getMaxIdEndereco");
        if (l == null) {
            l = 0L;
        }
        produtor.getUsuario().getEndereco().setId(l + 1);

        Long id = (Long) PostGresMapConfig.getSqlMapClient().queryForObject("getMaxIdContato");
        if (id == null) {
            id = 0L;
        }
        for (Contato d : produtor.getUsuario().getContatos()) {
            d.setId(++id);
        }

        id = proxId();
        produtor.setId(id);

        PostGresMapConfig.getSqlMapClient().insert("addProdutor", produtor);
    }

    public synchronized void update(Produtor produtor) throws SQLException {
        Long id = (Long) PostGresMapConfig.getSqlMapClient().queryForObject("getMaxIdContato");
        if (id == null) {
            id = 0L;
        }
        for (Contato d : produtor.getUsuario().getContatos()) {
            d.setId(++id);
        }
        PostGresMapConfig.getSqlMapClient().update("updateProdutor", produtor);
    }

    public void reativarProdutor(Produtor produtor) throws SQLException {
        PostGresMapConfig.getSqlMapClient().update("reativarProdutor", produtor);
    }

    public void vincularAdrs(Produtor produtor) throws SQLException {
        PostGresMapConfig.getSqlMapClient().update("vincularProdutorAdrs", produtor);
    }

    public void transferirProdutoresAdrs(Map adrss) throws SQLException {
        PostGresMapConfig.getSqlMapClient().update("transferirProdutoresAdrs", adrss);
    }

    public void delete(Produtor produtor) throws SQLException {
        PostGresMapConfig.getSqlMapClient().update("deleteProdutor", produtor);
    }

    public Produtor getByUsuarioId(Long id) throws SQLException {
        return (Produtor) PostGresMapConfig.getSqlMapClient().queryForObject("getProdutorByUsuarioId", id);
    }

    public Produtor getByConjugeCpf(String cpf) throws SQLException {
        return (Produtor) PostGresMapConfig.getSqlMapClient().queryForObject("getProdutorByConjugeCpf", cpf);
    }

    public Produtor getByDap(String dap) throws SQLException {
        return (Produtor) PostGresMapConfig.getSqlMapClient().queryForObject("getProdutorByDap", dap);
    }

    public Produtor getByUsuarioIdToAtivarConta(Long id) throws SQLException {
        return (Produtor) PostGresMapConfig.getSqlMapClient().queryForObject("getProdutorByUsuarioIdToAtivarConta", id);
    }

    public Produtor getById(Long id) throws SQLException {
        return (Produtor) PostGresMapConfig.getSqlMapClient().queryForObject("getProdutorById", id);
    }

    public List<Produtor> getByAdrsId(Long id) throws SQLException {
        return (List<Produtor>) PostGresMapConfig.getSqlMapClient().queryForList("getProdutoresByAdrsId", id);
    }

    public List<Produtor> getAll() throws SQLException {
        return (List<Produtor>) PostGresMapConfig.getSqlMapClient().queryForList("getAllProdutores");
    }

    public List<Produtor> getVinculados() throws SQLException {
        return (List<Produtor>) PostGresMapConfig.getSqlMapClient().queryForList("getProdutoresVinculados");
    }

    public List<Produtor> searchByNome(String nome) throws SQLException {
        return (List<Produtor>) PostGresMapConfig.getSqlMapClient().queryForList("getProdutoresByNome", nome);
    }
    
    public List<Produtor> searchByLocalidade(String nome) throws SQLException {
        return (List<Produtor>) PostGresMapConfig.getSqlMapClient().queryForList("getProdutoresByLocalidade", nome);
    }

    public Produtor searchByCPF(String cpf) throws SQLException {
        return (Produtor) PostGresMapConfig.getSqlMapClient().queryForObject("getProdutoresAtivosEInativosByCpf", cpf);
    }

    public List<Produtor> getProdutoresSemQuestSanitarioByAdrsPrazo(Map dadosAdrsPrazo) throws SQLException {
        return (List<Produtor>) PostGresMapConfig.getSqlMapClient().queryForList("getProdutoresSemQuestSanitarioPrazoByAdrsId", dadosAdrsPrazo);
    }

    public List<Produtor> getProdutoresSemQuestQualitativoByAdrsPrazo(Map dadosAdrsPrazo) throws SQLException {
        return (List<Produtor>) PostGresMapConfig.getSqlMapClient().queryForList("getProdutoresSemQuestQualitativoByAdrsId", dadosAdrsPrazo);
    }

    public List<Produtor> getProdutoresSemQuestQuantitativoByAdrsPrazo(Map dadosAdrsPrazo) throws SQLException {
        return (List<Produtor>) PostGresMapConfig.getSqlMapClient().queryForList("getProdutoresSemQuestQuantitativoByPrazoAdrsId", dadosAdrsPrazo);
    }

    private Long proxId() throws SQLException {
        Long id = (Long) PostGresMapConfig.getSqlMapClient().queryForObject("getMaxProdutorId");
        if (id == null) {
            id = 0L;
        }
        return id + 1;
    }

    public List<Produtor> getExcluidos() throws SQLException {
        return (List<Produtor>) PostGresMapConfig.getSqlMapClient().queryForList("getProdutoresExcluidos");
    }

    public List<Produtor> getByEstadoId(Long id) throws SQLException {
        return (List<Produtor>) PostGresMapConfig.getSqlMapClient().queryForList("getProdutoresByEstadoId", id);
    }

    public List<Produtor> getByMunicipioId(Long id) throws SQLException {
        return (List<Produtor>) PostGresMapConfig.getSqlMapClient().queryForList("getProdutoresByMunicipioId", id);
    }
}
